打包体积优化

您所在的位置:网站首页 ant design tree 打包体积优化

打包体积优化

2024-07-11 00:53:27| 来源: 网络整理| 查看: 265

在现代 JS 应用中,通过模块化打包工具可以自动将一些未使用的模块代码去除,这个过程叫做 Tree Shaking。不过如果你已经对此非常熟悉了,你会发现现实中它并不是那么完美,我们还需要一些额外的操作才能达到最佳的体积优化效果。今天,我们就来讲讲一个 ConfigProvider 导致的 Tree Shaking 失效的问题。

ConfigProvider 与 rc-field-form

在日常维护中,我们遇到了一些关于使用 ConfigProvider 会导致 BundleSize 变大的问题:

https://github.com/ant-design/ant-design/issues/41607https://github.com/ant-design/ant-design/issues/43019https://github.com/ant-design/ant-design/issues/42499

而社区在反馈的同时也把被错误打包进来的包找了出来 rc-field-form,这里我们就直接借用一下 issue 中的图示:

bundle size

ConfigProvider 提供了全局化配置能力,其中也包含了 Form 组件校验信息的自定义模板配置:

Customize

由于该功能对表单的校验有依赖关系,因而它由底层的 rc-field-form 提供的 FormProvider 实现。在 antd 中会先和自身的本地化后的 validateMessages 做聚合:

// Sample only. Not real world code.import { FormProvider } from 'rc-field-form'; const ConfigProvider = ({ validateMessages, children }) => { const mergedValidateMessages = React.useMemo( () => merge(antdDefaultValidateMessages, validateMessages), [validateMessages], ); return ( {children} );};

而 FormProvider 本身又对 rc-field-form 的 FormContext 进行了封装,导致引入 FormProvider 后将 rc-field-form 的更多内容给打包进来了:

Deps

你或许会想到,我们是不是可以做一个优化,如果没有配置 validateMessages 我们就不调用这个 FormProvider?

// Sample only. Not real world code.import { FormProvider } from 'rc-field-form'; const ConfigProvider = ({ validateMessages, children }) => { let node = children; if (validateMessages) { node = {node}; } return node;};

很遗憾,这是不行的。Tree Shaking 是静态编译过程,而 validateMessages 是一个运行时的配置。所以在打包过程中,我们无法知道 validateMessages 是否存在,因而无法做到这样的优化。

拆解依赖

rc-field-form 自然可以调整依赖,让 FormProvider 解耦。但是很明显,我们不应该依赖于第三方库的调整(虽然 rc-field-form 也由我们来维护)。我们应该从根本上解决这个问题,让 ConfigProvider 不再依赖于 FormProvider。实现也非常简单,既然这是 rc-field-form 所独有的,那么我们直接抽一个 Context 出来,让 ConfigProvider 不再感知 FormProvider 即可:

// Sample only. Not real world code.import { ValidateMessageContext } from '../form/context.ts'; const ConfigProvider = ({ validateMessages, children }) => { const mergedValidateMessages = ... return ( // Just use the proxy context {children} );};

而在 Form 中,同样消费代理的 Context:

// Sample only. Not real world code.import Form, { FormProvider } from 'rc-field-form'; import { ValidateMessageContext } from './context'; export default (props) => { const validateMessages = React.useContext(ValidateMessageContext); return ( );};

依赖就变成了这样,从而实现了解耦:

New Deps总结

Tree Shaking 提供了一种自动化的方式来优化打包体积,但是我们需要注意一些细节。否则可能不慎导致一些依赖被错误的引入。以上。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭